package pe.tnova.generic.structure.project.springmvc.generic;

import java.util.List;
import java.util.logging.Logger;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaModelException;

import pe.tnova.generic.structure.project.springmvc.UI.OptionEntidadBean;
import pe.tnova.generic.structure.project.springmvc.soruce.SourceProjectCore;
import pe.tnova.generic.structure.project.springmvc.util.ConstantesTNOVA;

public class GenerarDAOBaseConfig {
	private static final Logger LOG = Logger.getLogger(GenerarCapaDAO.class.getName());

	private List<OptionEntidadBean> configuracionEntidades;
	private String strPackageBase;
	private IPackageFragment packBase;
	private IPackageFragment packBaseImpl;
	
	public GenerarDAOBaseConfig(SourceProjectCore sourceProjectCore, List<OptionEntidadBean> configuracionEntidades, String strPackageBase, IPackageFragment packBase,
			IPackageFragment packBaseImpl) {
		this.configuracionEntidades = configuracionEntidades;
		this.strPackageBase = strPackageBase;
		this.packBase = packBase;
		this.packBaseImpl = packBaseImpl;
		
	}

	public void startGeneric() throws JavaModelException {
		StringBuffer buffer = new StringBuffer();
		buffer.append(getInterfaceEntidad());
		ICompilationUnit interfazDAOBase = packBase.createCompilationUnit(ConstantesTNOVA.CLASS_DAO_BASE
				+ ConstantesTNOVA.EXTENSION_JAVA,
				buffer.toString(), true, null);
		interfazDAOBase.close();
		
		buffer = new StringBuffer();
		buffer.append(getClasesEntidad());
		ICompilationUnit calseDAOBaseImpl = packBaseImpl.createCompilationUnit(ConstantesTNOVA.CLASS_DAO_BASE_IMPL
				+ ConstantesTNOVA.EXTENSION_JAVA,
				buffer.toString(), true, null);
		calseDAOBaseImpl.close();
	}

	private Object getClasesEntidad() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("package " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_BASE_IMPL+";"+ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("import org.springframework.context.annotation.Bean;" + ConstantesTNOVA.EN);
		buffer.append("import org.springframework.context.annotation.Configuration;" + ConstantesTNOVA.EN);
		buffer.append("import org.springframework.context.annotation.Scope;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.core.db.GenericDAOBase;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.library.util.validate.ValidateUtil;" + ConstantesTNOVA.EN);
		buffer.append("import "+ strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_BASE+ConstantesTNOVA.DONT+"DAOBase;" + ConstantesTNOVA.EN);
		buffer.append(getImportsDependnecias() + ConstantesTNOVA.EN);		
		buffer.append("@Configuration(\"DAOBase\")" + ConstantesTNOVA.EN);
		buffer.append("public class DAOBaseImpl extends GenericDAOBase implements DAOBase {" + ConstantesTNOVA.EN+ ConstantesTNOVA.EN);
		for (OptionEntidadBean optionEntidadBean : this.configuracionEntidades) {
//			if(optionEntidadBean.isCheckGeneraCodigoDAOBASE()){
				buffer.append(ConstantesTNOVA.ET+"private "+optionEntidadBean.getNombreEntidad()+ConstantesTNOVA.CLASS_DAO_BASE+" "+(optionEntidadBean.getNombreEntidad().toLowerCase()+ConstantesTNOVA.CLASS_DAO_BASE+";")+ConstantesTNOVA.EN);
//			}
		}		
		buffer.append(ConstantesTNOVA.EN+ ConstantesTNOVA.EN);
		for (OptionEntidadBean optionEntidadBean : this.configuracionEntidades) {
//			if(optionEntidadBean.isCheckGeneraCodigoDAOBASE()){
				buffer.append(ConstantesTNOVA.ET+"@Bean "+ ConstantesTNOVA.EN);
				buffer.append(ConstantesTNOVA.ET+"@Scope(\"singleton\") "+ ConstantesTNOVA.EN);
				buffer.append(ConstantesTNOVA.ET+"public "+optionEntidadBean.getNombreEntidad()+ConstantesTNOVA.CLASS_DAO_BASE+" get"+optionEntidadBean.getNombreEntidad()+ConstantesTNOVA.CLASS_DAO_BASE+"(){" + ConstantesTNOVA.EN);
				buffer.append(ConstantesTNOVA.ET+ConstantesTNOVA.ET+"if(ValidateUtil.isNotNull("+(optionEntidadBean.getNombreEntidad().toLowerCase()+ConstantesTNOVA.CLASS_DAO_BASE)+")){"+ ConstantesTNOVA.EN);
				buffer.append(ConstantesTNOVA.ET+ConstantesTNOVA.ET+ConstantesTNOVA.ET+"return "+(optionEntidadBean.getNombreEntidad().toLowerCase()+ConstantesTNOVA.CLASS_DAO_BASE)+";"+ ConstantesTNOVA.EN);
				buffer.append(ConstantesTNOVA.ET+ConstantesTNOVA.ET+"}else{"+ ConstantesTNOVA.EN);
				buffer.append(ConstantesTNOVA.ET+ConstantesTNOVA.ET+ConstantesTNOVA.ET+"return new "+optionEntidadBean.getNombreEntidad()+ConstantesTNOVA.CLASS_DAO_BASE_IMPL+"(getEntityManager());"+ ConstantesTNOVA.EN);
				buffer.append(ConstantesTNOVA.ET+ConstantesTNOVA.ET+"}"+ ConstantesTNOVA.EN);
				buffer.append(ConstantesTNOVA.ET+"}"+ ConstantesTNOVA.EN+ ConstantesTNOVA.EN);
//			}
		}	
		buffer.append("}" + ConstantesTNOVA.EN);	
		return buffer.toString();
	}

	private String getImportsDependnecias() {
		StringBuffer buffer = new StringBuffer();
		for (OptionEntidadBean optionEntidadBean : this.configuracionEntidades) {
				buffer.append("import "+strPackageBase+ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_BASE+ConstantesTNOVA.DONT +optionEntidadBean.getNombreEntidad()+ConstantesTNOVA.CLASS_DAO_BASE+";"+ ConstantesTNOVA.EN);
		}		
		return buffer.toString();
	}

	private String getInterfaceEntidad() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("package " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_BASE+";"+ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("public interface DAOBase {" + ConstantesTNOVA.EN+ ConstantesTNOVA.EN);
		for (OptionEntidadBean optionEntidadBean : this.configuracionEntidades) {
			if(optionEntidadBean.isCheckGeneraCodigoDAOBASE()){
				buffer.append(ConstantesTNOVA.ET+optionEntidadBean.getNombreEntidad()+ConstantesTNOVA.CLASS_DAO_BASE+" get"+optionEntidadBean.getNombreEntidad()+ConstantesTNOVA.CLASS_DAO_BASE+"();" + ConstantesTNOVA.EN+ ConstantesTNOVA.EN);
			}
		}		
		buffer.append("}" + ConstantesTNOVA.EN);	
		return buffer.toString();
	}

}
